﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TheBullysStore.Models.ModuloAdministracion.Edificio;
using System.Configuration;
using System.Data.SqlClient;

namespace TheBullysStore.Models.ModuloServicios.CuotaEdificio
{
    public class CuotaEdificioDAO
    {
        public List<CuotaEdificioBean> ListarCuotaEdificio(CuotaEdificioBean cuotaEdificio)
        {
            try
            {
                List<CuotaEdificioBean> listacuota = new List<CuotaEdificioBean>();
                
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                SqlConnection sqlCon = new SqlConnection(cadenaConfiguracion);

                ///////////////////////////////////////////////////////////////////////
                string tipocuotaagua = "";
                int contometro = 0;
                int tipocuotamantenimiento = 0;

                sqlCon.Open();

                string commandString = "select contometro,tipo_prorrateo,tipocuota from edificio where estado=1 and id_edificio="+cuotaEdificio.IdEdificio+ " ";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    tipocuotaagua = Convert.ToString(dataReader[1]);
                    contometro = Convert.ToInt32(dataReader[0]);
                    tipocuotamantenimiento = Convert.ToInt32(dataReader[2]);

                }
                dataReader.Close();
                sqlCon.Close();

                ///////////////////////////////////////////////////////////////////////

                if ((contometro == 1) && (tipocuotamantenimiento == 1))
                {
                    //CONTOMETRO Y MANTENIMIENTO UNICO
                    
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.monto_cuota,aaa.registro_inicio,aaa.registro_final,aaa.diferencia_agua,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua "+
                    "from (select d.numero as 'numero_departamento',c.monto_cuota as 'monto_cuota',b.registro_inicio,b.registro_final,b.diferencia_agua, ((b.diferencia_agua*(678.0/480.0))+(30.0)) as 'monto_agua' "+
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as  'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b  on a.id_cuenta=b.id_cuenta "+
                    "inner join (select z.*,x.montocuota as 'monto_cuota'  from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1)  x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta "+
                    "inner join (select * from departamento where estado=1) d on  d.id_departamento=a.id_departamento "+
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";

                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.AguaInicio = Convert.ToDouble(dataReader[2]);
                        CuotaEdificio.AguaFinal = Convert.ToDouble(dataReader[3]);
                        CuotaEdificio.AguaConsumida = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[5]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[6]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;
                        listacuota.Add(CuotaEdificio);
                    }
                    dataReader.Close();
                    sqlCon.Close();

                }

                else if ((contometro == 1) && (tipocuotamantenimiento == 2))
                {
                //CONTOMETRO Y MANTENIMIENTO POR AREA
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.monto_cuota,aaa.area,aaa.registro_inicio,aaa.registro_final,aaa.diferencia_agua,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua "+
                    "from (select d.numero as 'numero_departamento',d.area*c.monto_cuota as 'monto_cuota',d.area,b.registro_inicio,b.registro_final,b.diferencia_agua, ((b.diferencia_agua*(678.0/480.0))+(30.0)) as 'monto_agua' "+
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as  'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b  on a.id_cuenta=b.id_cuenta "+
                    "inner join (select z.*,x.montocuota as 'monto_cuota'  from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1) x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta "+
                    "inner join (select * from departamento where estado=1) d on  d.id_departamento=a.id_departamento "+
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";

                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.AreaDepartamento = Convert.ToDouble(dataReader[2]);
                        CuotaEdificio.AguaInicio = Convert.ToDouble(dataReader[3]);
                        CuotaEdificio.AguaFinal = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.AguaConsumida = Convert.ToDouble(dataReader[5]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[6]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[7]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;

                        listacuota.Add(CuotaEdificio);

                    }
                    dataReader.Close();
                    sqlCon.Close();
                
                
                }

                else if ((tipocuotaagua == "Persona") && (tipocuotamantenimiento == 1)) { 
                //AGUA POR PERSONAS Y MANTENIMIENTO UNICO
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.monto_cuota,aaa.numero_personas,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua " +
                    "from (select d.numero as 'numero_departamento',c.monto_cuota as 'monto_cuota',d.num_personas as 'numero_personas',((d.num_personas*1.0*1000)/3) as 'monto_agua' " +
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as 'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b  on a.id_cuenta=b.id_cuenta " +
                    "inner join (select z.*,x.montocuota as 'monto_cuota'  from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1) x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta " +
                    "inner join ( select vv.id_departamento,vv.numero,count(nn.id_persona) as 'num_personas' from  (select * from departamento where estado=1 and id_edificio="+ cuotaEdificio.IdEdificio + " )vv " +
                    "left join (select tt.* from persona tt inner join (select * from habitante where es_inquilino=1) hh on hh.id_persona=tt.id_persona where tt.estado=1) nn on nn.id_departamento=vv.id_departamento " +
                    "where vv.estado=1 group by vv.id_departamento, vv.numero  ) d on d.id_departamento=a.id_departamento " +
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";

                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.NumPersonas = Convert.ToInt32(dataReader[2]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[3]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;

                        listacuota.Add(CuotaEdificio);

                    }
                    dataReader.Close();
                    sqlCon.Close();
                
                }

                else if ((tipocuotaagua == "Persona") && (tipocuotamantenimiento == 2))
                {
                //AGUA POR PERSONAS Y MANTENIMIENTO POR AREA
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.area_depa,aaa.monto_cuota,aaa.numero_personas,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua "+
                    "from (select d.numero as 'numero_departamento',c.monto_cuota*d.area as 'monto_cuota',d.area as 'area_depa',d.num_personas as 'numero_personas', ((d.num_personas*1.0*1000)/3) as 'monto_agua' "+
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as 'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b on a.id_cuenta=b.id_cuenta "+
                    "inner join (select z.*,x.montocuota as 'monto_cuota' from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1) x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta "+
                    "inner join ( select vv.id_departamento,vv.numero,vv.area,count(nn.id_persona) as 'num_personas' from  (select * from departamento where estado=1 and id_edificio=" + cuotaEdificio.IdEdificio + " )vv " +
                    "left join (select tt.* from persona tt inner join (select * from habitante where es_inquilino=1) hh on hh.id_persona=tt.id_persona where tt.estado=1) nn on nn.id_departamento=vv.id_departamento "+
                    "where vv.estado=1 group by vv.id_departamento, vv.numero, vv.area  ) d on d.id_departamento=a.id_departamento " +
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";

                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[2]);
                        CuotaEdificio.NumPersonas = Convert.ToInt32(dataReader[3]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.AreaDepartamento=Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[5]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;
                        listacuota.Add(CuotaEdificio);

                    }
                    dataReader.Close();
                    sqlCon.Close();
                }
                else if ((tipocuotaagua == "Area") && (tipocuotamantenimiento == 1))
                {
                //AGUA POR AREA Y MANTENIMIENTO UNICO
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.monto_cuota,aaa.area_departamento,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua "+
                    "from (select d.numero as 'numero_departamento',c.monto_cuota as 'monto_cuota',d.area as 'area_departamento',((d.area*1000)/1720) as 'monto_agua' "+
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as 'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b on a.id_cuenta=b.id_cuenta "+
                    "inner join (select z.*,x.montocuota as 'monto_cuota' from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1) x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta "+
                    "inner join (select * from departamento where estado=1) d on d.id_departamento=a.id_departamento "+
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";

                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.AreaDepartamento = Convert.ToDouble(dataReader[2]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[3]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;
                        listacuota.Add(CuotaEdificio);

                    }
                    dataReader.Close();
                    sqlCon.Close();
                
                }
                else if ((tipocuotaagua == "Area") && (tipocuotamantenimiento == 2))
                {
                //AGUA POR AREA Y MANTENIMIENTO POR AREA
                    sqlCon.Open();

                    commandString = "select aaa.numero_departamento,aaa.monto_cuota,aaa.area_departamento,aaa.monto_agua,aaa.monto_cuota+aaa.monto_agua " +
                    "from (select d.numero as 'numero_departamento',c.monto_cuota*d.area as 'monto_cuota',d.area as 'area_departamento',((d.area*1000)/1720) as 'monto_agua' "+
                    "from (select * from cuenta_por_cobrar where estado=1) a inner join (select aa.*,aa.registro_final-aa.registro_inicio as 'diferencia_agua' from consumo_de_agua aa where aa.estado=1) b on a.id_cuenta=b.id_cuenta "+
                    "inner join (select z.*,x.montocuota as 'monto_cuota' from (select * from cuota where estado=1) z inner join (select * from edificio where estado=1) x on z.id_edificio=x.id_edificio) c on a.id_cuenta=c.id_cuenta "+
                    "inner join (select * from departamento where estado=1) d on d.id_departamento=a.id_departamento "+
                    "where a.estado=1 and c.id_edificio=" + cuotaEdificio.IdEdificio + " and a.anio=" + cuotaEdificio.Anio + " and a.mes=" + cuotaEdificio.Mes + " ) aaa";
                    
                    sqlCmd = new SqlCommand(commandString, sqlCon);

                    dataReader = sqlCmd.ExecuteReader();

                    while (dataReader.Read())
                    {
                        CuotaEdificioBean CuotaEdificio = new CuotaEdificioBean();
                        CuotaEdificio.NumeroDepartamento = Convert.ToInt32(dataReader[0]);
                        CuotaEdificio.MontoMantenimiento = Convert.ToDouble(dataReader[1]);
                        CuotaEdificio.AreaDepartamento = Convert.ToDouble(dataReader[2]);
                        CuotaEdificio.MontoAgua = Convert.ToDouble(dataReader[3]);
                        CuotaEdificio.MontoTotal = Convert.ToDouble(dataReader[4]);
                        CuotaEdificio.TipoCuotaAgua = tipocuotaagua;
                        CuotaEdificio.Contometro = contometro;
                        CuotaEdificio.TipoCuotaMantenimiento = tipocuotamantenimiento;
                        listacuota.Add(CuotaEdificio);

                    }
                    dataReader.Close();
                    sqlCon.Close();
                
                }

                //////////////////////////////////////////////////////////////////////////////

                return listacuota;
            }
            catch (Exception e)
            {
                String men = e.ToString();
                cuotaEdificio.Conexion = men;
                return null;
            }
        }

    }
}